package 剑指offer.demo4;

import java.util.Stack;

//https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?
/*
模拟一下入栈过程，期间配合出战顺序操作，观察是否可以按这个顺序完成
 */
public class 栈的压入弹出序列 {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        //合法性判断
        if (pushA == null || popA == null || popA.length == 0 || pushA.length == 0){
            return false;
        }
        //新建一个栈用来帮助判断
        Stack<Integer> stack = new Stack<>();
        //循环判断出栈顺序
        int j = 0;
        for (int i = 0; i < pushA.length; i++) {
            //把值按顺序压入栈
            stack.push(pushA[i]);
            //如果此时栈顶和出栈顺序相同说明这里开始有出栈操作了，我们出栈后再进行对比
            while (!stack.isEmpty() && popA[j] == stack.peek()){
                stack.pop();
                j++;
            }
            //栈空了就跳出继续重新入剩下的栈，栈顶不相等说明这里没有继续出栈了，我们让他继续入剩下的
        }
        //循环走完，所有入栈元素都入了，如果栈不空说明出栈时顺序不对剩余元素无法按这个顺序出，有的元素出得早了
        return stack.isEmpty();
    }
}
